※ 본 포스팅은 MATLAB R2023b 버전을 기준으로 작성되었습니다.

함수를 왜 사용해야 하는가?

벽돌로 집을 짓는 상상을 해보자. 이 때, 벽돌을 하나 하나 쌓을 수도 있을 것이다.


그림 1. 벽돌을 쌓아 집을 짓는 모습을 상상해보자 (Bing Image Creator로 제작)

그런데, 정해진 모양대로만 벽돌을 쌓아다 가져다 주는 일을 하는 사람이 정해져 있다면 업무가 효율적일 수 있다. 이 사람에게는 벽돌 100개를 주면 정확히 네모진 모양으로 쌓아다 가져다주는 일을 한다고 가정해볼 수도 있다.


그림 2. 정해진 모양으로 벽돌을 쌓아다주는 사람: 함수(Bing Image Creator로 제작)

그림 2에서 말하는 것이 바로 함수가 하는 일이다. 다시 말하면 함수는 입력(벽돌 1000개)을 주면 출력(쌓아둔 벽돌)을 내놓는다. 또, 함수는 전체 과정(집 짓기)의 일부(벽돌 쌓기)만 담당하여 반복 수행한다. 프로그래밍의 목적은 특정 업무를 수행하는 것이라는 것을 잊지 말아야 한다. 그런데 수행하고자 하는 업무가 꽤 커지기 시작하면 업무를 분담하여 작업하는 것이 효율적일 뿐 더러 실수를 줄일 수 있다.

함수를 만들고 저장하는 법

m 파일로 저장하는 방법 (1)

간단한 예시를 통해 MATLAB에서 함수를 만드는 방법을 알아보자. MATLAB에서 함수를 만드는 가장 기본적인 방법은 별도의 m 파일로 함수를 구현하여 저장하는 것이다. 아래 그림과 같이 HOME > New > Function 버튼을 클릭해보자.


그림 3. 함수의 기본 틀을 가지고 있는 m 파일을 쉽게 만들 수 있도록 도와주는 버튼

그림 3에서 설명하는 버튼을 누르면 아래 그림 4와 같이 함수의 기본 템플릿을 가지고 있는 m 파일이 자동 생성되게 된다. 그림 4를 기준으로 함수의 이름은 untitled5로 지정되어 있다. 또, 템플릿에는 입력 인자(input arguments)가 2개, 출력 인자(output arguments)가 2개로 기본 설정되어 있다.


그림 4. 함수 생성 버튼을 눌렀을 때 나오는 가장 기본 템플릿

우리는 그림 4에서와 같이 얻은 기본 템플릿을 수정하여 timestwo라는 함수를 정의해보자. timestwo은 입력 1개와 출력 1개를 가질 것이며, 입력에 2를 곱해서 출력해주는 작동을 한다고 해보자. 이를 구현하기 위해 아래의 그림 5와 같이 템플릿을 수정해보자. 그리고 timestwo.m이라는 이름으로 파일을 저장하자.


그림 5. 입출력을 각각 1개씩 가지며 입력에 2를 곱해 출력해주는 함수 timestwo.

그리고 새로운 스크립트를 열어 아래와 같이 입력하고 main.m이라고 저장하자.

y = timestwo(3)

main.m 파일을 저장하고 매트랩 Current Folder 을 보면 함수 m 파일 아이콘과 스크립트 m 파일의 아이콘 형태가 다른 것을 확인할 수 있다.


그림 6. 함수용 m 파일과 스크립트용 m 파일은 서로 다른 아이콘을 사용한다.

이제 main.m을 실행해보면 아래와 같은 결과가 나오는 것을 알 수 있다.

>> main

y =

     6

여기까지 우리는 timestwo라는 함수를 하나의 m 파일에 저장하고 불러오는 방법에 대해 알아보았다. 이 때 함수 기본 템플릿을 사용하였다는 점을 기억하도록 하자. 함수를 정의하는 과정이 익숙해졌다면 꼭 템플릿을 쓰지 않고 function으로 시작해 end로 끝나는 m 파일을 만들어주어도 괜찮다.

m 파일로 저장하는 법 (2)

m 파일을 먼저 만들지 않고 리팩토링(Refactoring) 기능을 이용하여 스크립트를 작성하는 도중에 함수화 시킬 수도 있다. MATLAB Editor의 리팩토링 기능은 R2021b에 도입되었다 (참조)


그림 7. 리팩토링 버튼에서 찾을 수 있는 Convert to Function 기능의 위치

예를 들어 아래와 같은 스크립트를 작성하던 중이었다고 생각해보자.

x = 3;

y = 2 * x;

이 때 y = 2 * x;라는 부분을 함수화 시키고 싶은 생각이 들었다고 해보자. 그러면 함수화 시키고 싶은 부분의 스크립트를 선택한 다음 그림 7의 리팩토링 버튼을 누르거나 선택된 스크립트를 우클릭하여 Convert to Function 버튼을 눌러보자.


그림 8. 마우스 우클릭 시 Conver to Function 기능의 위치

그런 다음 timestwo2라는 이름으로 저장하면 자동으로 timestwo2.m이라는 m 파일이 만들어지면서 원래의 스크립트도 아래와 같이 자동으로 바뀌는 것을 알 수 있다.

x = 3;

timestwo2(x); % 원래는 y = 2 * x; 였음.


그림 9. 자동 원래 스크립트의 코드가 변경되면서 timestwo2.m 파일도 자동으로 생성된다

로컬 함수로 만드는 법

전통적으로 매트랩에서 함수를 정의하기 위해서는 따로 m 파일을 만들어주어야 했지만 R2016b 부터는 로컬 함수라고 하여 m 파일 끝에 함수의 정의를 포함하여 쓸 수도 있게 되었다 (참조). 리팩토링 기능을 이용해 로컬 함수를 정의해서 사용해보도록 하자.

예를 들어 아래와 같은 스크립트를 작성하던 중이었다고 생각해보자.

x = 3;

y = 2 * x;

그림 8에서 본 것과 같이 y = 2 * x;라는 글자를 모두 선택하여 우클릭한 다음 “Convert to Local Function”을 선택해보자. 그럼 그림 10과 같이 로컬 함수가 자동으로 정의되며 생성되는 것을 알 수 있다.


그림 10. 리팩토링 기능을 이용해 "Convert to Local Function" 기능을 누르면 이렇게 로컬 함수가 정의된다.

함수 이름을 timestwo3으로 정의해주고 출력값도 y로 붙여주자. 결과적으로 전체 스크립트는 아래와 같다.

x = 3;

timestwo3(x)

function y = timestwo3(x)
y = 2 * x;
end

이 스크립트를 main3.m으로 저장하고 Run 버튼을 누르면 예상한 것과 같은 결과를 얻을 수 있다.

>> main3

ans =

     6

로컬 함수를 사용하면 m 파일 하나에 함수를 그때 그때 정의해가면서 사용할 수 있어서 편할 뿐 더러 해당 m 파일의 로컬 함수는 다른 m 파일과 공유되지 않으므로 독자적인 함수를 구축하려고 할 때 편리하다.